package com.beney.util.math;

import java.util.Random;

/**
 * 初中中数学题生成器
 * 单例模式 + 责任链模式
 *
 * @author Beney
 */
public class JuniorMath extends AbstractMath {

    /**
     * 生成器单例
     */
    private static JuniorMath generator;

    /**
     * 单目运算符
     */
    private String leftOprand = "√", rightOprand = "²";

    private AbstractMath lowerMathGenerator; // 下一个包装者

    private int leftNeed;
    private int rightNeed;

    private void initLower() {
        lowerMathGenerator = PrimaryMath.getGenerator();
    }

    /**
     * 初始化以便在每一条等式中出现至少一个当前角色需要的操作符
     */
    @Override
    protected void initSpecificNeed() {
        if (new Random().nextBoolean()) {
            leftNeed = 1;
            rightNeed = 0;
        } else {
            leftNeed = 0;
            rightNeed = 1;
        }
    }

    /**
     * 初中可以有√和²，且至少有一个
     *
     * 初中使用下层的服务继续随机包装
     * (小学(初中))
     */
    @Override
    protected String wrapVal(StringBuilder val) {
        if (leftNeed-- > 0)         val.insert(0, leftOprand);
        else if (rightNeed-- > 0)   val.append(rightOprand);
        // 随机包装val
        else {
            int t = new Random().nextInt(100);
            if (t < 20)         val.insert(0, leftOprand);
            else if (t < 40)    val.append(rightOprand);
        }
        return lowerMathGenerator.wrapVal(val);
    }



    /**
     * @return 初中数学题生成器
     */
    public static AbstractMath getGenerator() {
        if (generator == null)
            generator = new JuniorMath();
        generator.initLower();
        return generator;
    }
}
